package client.controleur;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.rmi.RemoteException;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import modele.Coordonnee;
import modele.Puissance;
import modele.Region;
import client.vue.Jeu;
import codebase.IPartie;

public class JeuMouseListener implements MouseListener {
	private Jeu vue;
	private IPartie partie;
	private Region precRegion;
	private Region regInter; // pour le convoi et le soutient offensif
	private String choix = "vide";
	private ArrayList<String> listOrdre = new ArrayList<String>();

	public JeuMouseListener(Jeu fenetre, IPartie partie) {
		this.vue = fenetre;
		this.partie = partie;
	}

	@Override
	public void mouseClicked(MouseEvent arg0) {

	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	public void ajoutOrdre(String s) {
		String[] tab = s.split(" ");
		String existant = "";
		int rep = 1;
		for (String o : listOrdre) {
			String[] tabOPresent = o.split(" ");
			if (tab[0].equals(tabOPresent[0]) && tab[2].equals(tabOPresent[2])) {
				String[] valide = { "Existant", "Nouveau" };
				rep = JOptionPane.showOptionDialog(new JFrame(),
						"Un ordre existe déjà pour cette région :\nOrdre existant : " + o
								+ "\nNouvel Ordre  : " + s + "\nQuel ordre voulez-vous garder ?",
						"Diplomacy", JOptionPane.YES_NO_CANCEL_OPTION,
						JOptionPane.QUESTION_MESSAGE, null, valide, valide[1]);
				existant = o;
				break;
			}
		}
		if (!existant.equals("") && rep == 1) {
			try {
				partie.removeOrdre(existant);
				partie.addOrdre(s);
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			listOrdre.remove(existant);
			listOrdre.add(s);
		} else if (existant.equals("")) {
			listOrdre.add(s);
			try {
				partie.addOrdre(s);
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("Liste ordre : " + listOrdre);
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		if (arg0.getX() < 913 && arg0.getY() < 763) {
			Coordonnee c = new Coordonnee(arg0.getX(), arg0.getY());
			Region region = null;
			try {
				region = partie.getRegionWithPos(c);
			} catch (RemoteException e) {
				e.printStackTrace();
			}
			if (region != null) {

				if (precRegion == null) {
					// C'est son premier clic
					// On verifie que la region lui appartient
					boolean possede = false;
					try {
						for (Puissance p : vue.getJoueur().getListPuissance()) {
							for (Region r : p.getListeRegionsPossedes()) {
								if (region.getNom().equals(r.getNom())) {
									possede = true;
									System.out.println("\tJoueur " + vue.getJoueur().getNom()
											+ " possede " + r.getNom());
									break;
								}
							}
						}
					} catch (RemoteException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					// Si appartient et bien une unite
					if (possede && region.getOccupant() != null) {
						ArrayList<String> listOpt = new ArrayList<String>() {
							{
								add("Attaquer");
								add("Tenir position");
								add("Soutien defensif");
								add("Soutien offensif");
								add("Convoi");
							}
						};
						try {
							if (region.getOccupant().getTypeUniteAbr().equals("A")) {
								// On enleve convoi
								listOpt.remove("Convoi");
							}
						} catch (RemoteException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
						int n = JOptionPane.showOptionDialog(new JFrame(),
								"Region : " + region.getNom() + "\nQue souhaitez-vous faire ?",
								"Diplomacy", JOptionPane.YES_NO_CANCEL_OPTION,
								JOptionPane.QUESTION_MESSAGE, null, listOpt.toArray(),
								listOpt.toArray()[1]);
						if (n == 1) {
							// Tenir position
							String[] valide = { "Valider", "Annuler" };
							int rep = JOptionPane.showOptionDialog(new JFrame(),
									"Ordre de Tenir position pour " + region.getNom() + " ?",
									"Diplomacy", JOptionPane.YES_NO_CANCEL_OPTION,
									JOptionPane.QUESTION_MESSAGE, null, valide, valide[0]);
							if (rep == 0) {
								// Creation et ajout de l'ordre
								String o;
								try {
									o = region.getOccupant().getProprietaire().getAbreviation()
											+ " " + region.getOccupant().getTypeUniteAbr() + " "
											+ region.getAbreviation() + " T";
									ajoutOrdre(o);
								} catch (RemoteException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}

							}
						} else {
							// On ajoute en attendant le prochain clic
							precRegion = region;
							try {
								choix = listOpt.get(n);
							} catch (Exception e) {
								precRegion = null;
								choix = "";
							}
						}
					} else {
						if (possede) {
							System.out.println("C a vous mais pas unite");
						}
						System.out.println("C est pas a vous");
					}
				} else {
					// Il a deja clique sur une region
					if (regInter == null) {
						// Verification qu'ils sont frontaliers
						// TODO voir pour sontien offensif pas oblige voisin
						if (precRegion.isFrontalier(region)
								|| choix.equalsIgnoreCase("Soutien offensif")) {
							String[] valide = { "Valider", "Annuler" };
							int rep = JOptionPane.showOptionDialog(new JFrame(),
									"Ordre de " + choix + " " + region.getNom() + " avec "
											+ precRegion.getNom() + " ?", "Diplomacy",
									JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
									null, valide, valide[0]);
							if (rep == 0) {
								String o = "";
								boolean add = true;
								if (choix.equalsIgnoreCase("Attaquer")) {
									try {
										o = precRegion.getOccupant().getProprietaire()
												.getAbreviation()
												+ " "
												+ precRegion.getOccupant().getTypeUniteAbr()
												+ " "
												+ precRegion.getAbreviation()
												+ " - "
												+ region.getAbreviation();
									} catch (RemoteException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}
								} else if (choix.equalsIgnoreCase("Soutien defensif")) {
									try {
										o = precRegion.getOccupant().getProprietaire()
												.getAbreviation()
												+ " "
												+ precRegion.getOccupant().getTypeUniteAbr()
												+ " "
												+ precRegion.getAbreviation()
												+ " S "
												+ region.getAbreviation();
									} catch (RemoteException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}
								} else if (choix.equalsIgnoreCase("Soutien offensif")) {

									try {
										o = precRegion.getOccupant().getProprietaire()
												.getAbreviation()
												+ " "
												+ precRegion.getOccupant().getTypeUniteAbr()
												+ " "
												+ precRegion.getAbreviation()
												+ " qui attaque ?";
									} catch (RemoteException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}

									JOptionPane
											.showMessageDialog(new JFrame("Diplomacy"), o + "\n");
									regInter = region;
									add = false;
								}
								if (add) {
									ajoutOrdre(o);
									precRegion = null;
									choix = null;
								}
							} else {
								JOptionPane.showMessageDialog(new JFrame("Diplomacy"), "Annule");
								precRegion = null;
								choix = null;
							}
						} else {
							JOptionPane.showMessageDialog(new JFrame("Message"),
									"Vous ne pouvez attaquer qu'une region frontaliere ");
						}
					} else {
						// On fait un soutien ou un convoi
						String[] valide = { "Valider", "Annuler" };
						int rep = JOptionPane.showOptionDialog(new JFrame(), "Ordre de " + choix
								+ " " + regInter.getNom() + " qui attaque " + region.getNom()
								+ "avec " + precRegion.getNom() + " ?", "Diplomacy",
								JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
								null, valide, valide[0]);
						if (rep == 0) {
							// AJout
							String o = "";
							if (choix.equalsIgnoreCase("Soutien offensif")) {

								try {
									o = precRegion.getOccupant().getProprietaire().getAbreviation()
											+ " " + precRegion.getOccupant().getTypeUniteAbr()
											+ " " + precRegion.getAbreviation() + " S "
											+ regInter.getAbreviation() + " - "
											+ region.getAbreviation();
								} catch (RemoteException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}

							} else {
								// Convoi

								try {
									o = precRegion.getOccupant().getProprietaire().getAbreviation()
											+ " " + precRegion.getOccupant().getTypeUniteAbr()
											+ " " + precRegion.getAbreviation() + " C "
											+ regInter.getAbreviation() + " - "
											+ region.getAbreviation();
								} catch (RemoteException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}

							}
							ajoutOrdre(o);
							precRegion = null;
							regInter = null;
							choix = null;
						} else {
							JOptionPane.showMessageDialog(new JFrame("Diplomacy"), "Annule");
							precRegion = null;
							regInter = null;
							choix = null;
						}

					}
				}
			}
		}
	}
}
